package handler_sys

import (
	"go_web/internal/model"
	_ "go_web/internal/model"
	"go_web/internal/model/model_sys"
	"go_web/internal/req/req_sys"
	"go_web/internal/res/res_sys"
	"go_web/internal/service/service_sys"
	"go_web/pkg/req"
	"go_web/pkg/res"
	"go_web/pkg/utils"
	"net/http"
	"strconv"
	"time"

	"github.com/gin-gonic/gin"
)

type SysUserHandler struct {
	SysUserService *service_sys.SysUserService
}

func NewSysUserHandler(SysUserService *service_sys.SysUserService) *SysUserHandler {
	return &SysUserHandler{SysUserService}
}

// Detail 查询SysUser详情
// @Summary 查询SysUser详情
// @Tags SysUserHandler
// @Accept json
// @Produce json
// @Param id query string true "主键ID"
// @Success 200 {object} res.R[model_sys.SysUser] "SysUser"
// @Router /sys-user/detail [get]
func (h *SysUserHandler) Detail(ctx *gin.Context) {
	id := ctx.Query("id")
	id64, err := strconv.ParseInt(id, 10, 64)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": "无效的ID"})
		return
	}
	SysUser, err := h.SysUserService.Detail(ctx, id64)
	if err != nil {
		ctx.JSON(http.StatusOK, res.NewR[string]().Fail("查询不到"))
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[model_sys.SysUser]().Ok(*SysUser))
}

// Page 分页查询SysUser
// @Summary 分页查询SysUser
// @Tags SysUserHandler
// @Accept json
// @Produce json
// @Param queryParams query req_sys.SysUserPageReq false "分页请求参数"
// @Success 200 {object} res.R[res.PageRes]
// @Router /sys-user/page [get]
func (h *SysUserHandler) Page(ctx *gin.Context) {
	var pageReq req_sys.SysUserPageReq
	if err := ctx.ShouldBindQuery(&pageReq); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	page, err := h.SysUserService.Page(ctx, pageReq)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	ctx.JSON(http.StatusOK, res.NewR[res.PageRes]().Ok(*page))
}

// Add 创建SysUser
// @Summary 创建SysUser
// @Tags SysUserHandler
// @Accept json
// @Produce json
// @Param jsonParams body req_sys.SysUserAddReq true "SysUser"
// @Success 200 {object} res.R[int64] "操作结果"
// @Router /sys-user/add [post]
func (h *SysUserHandler) Add(ctx *gin.Context) {
	var reqSys req_sys.SysUserAddReq
	if err := ctx.ShouldBindJSON(&reqSys); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	validCode := ctx.Query("validCode")
	authCode := ctx.Query("authCode")
	isCodeAccess := utils.VerifyCode(validCode, authCode)
	if !isCodeAccess {
		ctx.JSON(http.StatusOK, res.NewR[string]().Fail("验证码不对"))
		return
	}
	id, err := h.SysUserService.Add(ctx, reqSys)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[int64]().Ok(id))
}

// Edit 修改SysUser
// @Summary 修改SysUser
// @Tags SysUserHandler
// @Accept json
// @Produce json
// @Param jsonParams body req_sys.SysUserEditReq true "SysUser"
// @Success 200 {object} res.R[int64] "操作结果"
// @Router /sys-user/edit [post]
func (h *SysUserHandler) Edit(ctx *gin.Context) {
	var reqSys req_sys.SysUserEditReq
	if err := ctx.ShouldBindJSON(&reqSys); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	n, err := h.SysUserService.Edit(ctx, reqSys)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[int64]().Ok(n))
}

// Delete 删除SysUser
// @Summary 删除SysUser
// @Tags SysUserHandler
// @Accept json
// @Produce json
// @Param jsonParams body req.IdsReq true "ID集合"
// @Success 200 {object} res.R[int64] "操作结果"
// @Router /sys-user/delete [post]
func (h *SysUserHandler) Delete(ctx *gin.Context) {
	var idsReq req.IdsReq
	if err := ctx.ShouldBindJSON(&idsReq); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	n, err := h.SysUserService.Delete(ctx, idsReq)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[int64]().Ok(n))
}

// Login 登录用户
// @Summary 登录用户
// @Tags SysUserHandler
// @Accept json
// @Produce json
// @Param jsonParams body req_sys.SysLoginReq true "登录参数"
// @Success 200 {object} res.R[model.Token] "操作结果"
// @Router /sys-user/login [post]
func (h *SysUserHandler) Login(ctx *gin.Context) {
	var sysLoginReq req_sys.SysLoginReq
	if err := ctx.ShouldBindJSON(&sysLoginReq); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	validCode := ctx.Query("validCode")
	authCode := ctx.Query("authCode")
	isCodeAccess := utils.VerifyCode(validCode, authCode)
	if !isCodeAccess {
		ctx.JSON(http.StatusOK, res.NewR[string]().Fail("验证码不对"))
		return
	}
	token, userId, err := h.SysUserService.Login(ctx, sysLoginReq)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	err = utils.LoginAtRedis(ctx, token.AccessToken, *userId, time.Duration(token.Expire)*time.Second)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[model.Token]().Ok(*token))
}

// RefreshToken 刷新Token
// @Summary 刷新Token
// @Tags SysUserHandler
// @Accept json
// @Produce json
// @Success 200 {object} res.R[model.Token] "操作结果"
// @Router /sys-user/refresh-token [post]
func (h *SysUserHandler) RefreshToken(ctx *gin.Context) {
	token, userId, err := h.SysUserService.RefreshToken(ctx)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	err = utils.LoginAtRedis(ctx, token.AccessToken, *userId, time.Duration(token.Expire)*time.Second)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[model.Token]().Ok(*token))
}

// GetUserInfo 获取个人信息
// @Summary 获取个人信息
// @Tags SysUserHandler
// @Accept json
// @Produce json
// @Success 200 {object} res.R[res_sys.SysUserRes]
// @Router /sys-user/person-info [get]
func (h *SysUserHandler) GetUserInfo(ctx *gin.Context) {
	ret, err := h.SysUserService.GetUserInfo(ctx)
	if err != nil {
		ctx.JSON(http.StatusOK, res.NewR[string]().Fail(err.Error()))
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[res_sys.SysUserRes]().Ok(*ret))
}
